<html>
 <head>
  <meta charset="utf-8"/>
  <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"/>
  <title>
   Kaggle上的一次比赛：利用机器学习进行恶意代码分类  | 数螺 | NAUT IDEA
  </title>
  <link href="http://cdn.bootcss.com/bootstrap/3.3.6/css/bootstrap-theme.min.css" rel="stylesheet"/>
  <link href="http://cdn.bootcss.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet"/>
  <style type="text/css">
   #xmain img {
                  max-width: 100%;
                  display: block;
                  margin-top: 10px;
                  margin-bottom: 10px;
                }

                #xmain p {
                    line-height:150%;
                    font-size: 16px;
                    margin-top: 20px;
                }

                #xmain h2 {
                    font-size: 24px;
                }

                #xmain h3 {
                    font-size: 20px;
                }

                #xmain h4 {
                    font-size: 18px;
                }


                .header {
	           background-color: #0099ff;
	           color: #ffffff;
	           margin-bottom: 20px;
	        }

	        .header p {
                  margin: 0px;
                  padding: 10px 0;
                  display: inline-block;  
                  vertical-align: middle;
                  font-size: 16px;
               }

               .header a {
                 color: white;
               }

              .header img {
                 height: 25px;
              }
  </style>
  <script src="http://cdn.bootcss.com/jquery/3.0.0/jquery.min.js">
  </script>
  <script src="http://nautstatic-10007657.file.myqcloud.com/static/css/readability.min.js" type="text/javascript">
  </script>
  <script type="text/javascript">
   $(document).ready(function() {
                 var loc = document.location;
                 var uri = {
                  spec: "http://dataunion.org/20505.html",
                  host: "http://dataunion.org",
                  prePath: "http://dataunion.org",
                  scheme: "http",
                  pathBase: "http://dataunion.org/"
                 };
    
                 var documentClone = document.cloneNode(true);
                 var article = new Readability(uri, documentClone).parse();
     
                 document.getElementById("xmain").innerHTML = article.content;
                });
  </script>
  <!-- 1466461178: Accept with keywords: (title(0.2):利用,社区,分类,数盟,恶意代码, topn(0.6):概率,二进制,数盟,广谱,深度学习,分类器,利用,队伍,文件,特征,恶意代码,技术,子集,文章,数据,字节,样本,矩阵,算法,随机,启发式,像素,森林,方法,代码,分类,图像,冠军,信息,决策树).-->
 </head>
 <body onload="">
  <div class="header">
   <div class="container">
    <div class="row">
     <div class="col-xs-6 col-sm-6 text-left">
      <a href="/databee">
       <img src="http://nautidea-10007657.cos.myqcloud.com/logo_white.png"/>
      </a>
      <a href="/databee">
       <p>
        数螺
       </p>
      </a>
     </div>
     <div class="hidden-xs col-sm-6 text-right">
      <p>
       致力于数据科学的推广和知识传播
      </p>
     </div>
    </div>
   </div>
  </div>
  <div class="container text-center">
   <h1>
    Kaggle上的一次比赛：利用机器学习进行恶意代码分类
   </h1>
  </div>
  <div class="container" id="xmain">
   ﻿﻿
   <title>
    Kaggle上的一次比赛：利用机器学习进行恶意代码分类 | 数盟社区
   </title>
   <!-- All in One SEO Pack 2.2.7.6.2 by Michael Torbert of Semper Fi Web Design[32,74] -->
   <!-- /all in one seo pack -->
   <!--
<div align="center">
<a href="http://strata.oreilly.com.cn/hadoop-big-data-cn?cmp=mp-data-confreg-home-stcn16_dataunion_pc" target="_blank"><img src="http://dataunion.org/wp-content/uploads/2016/05/stratabj.jpg"/ ></a>
</div>
-->
   <header id="header-web">
    <div class="header-main">
     <hgroup class="logo">
      <h1>
       <a href="http://dataunion.org/" rel="home" title="数盟社区">
        <img src="http://dataunion.org/wp-content/themes/yzipi/images/logo.png"/>
       </a>
      </h1>
     </hgroup>
     <!--logo-->
     <nav class="header-nav">
      <ul class="menu" id="menu-%e4%b8%bb%e8%8f%9c%e5%8d%95">
       <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-71" id="menu-item-71">
        <a href="http://dataunion.org/category/events" title="events">
         活动
        </a>
        <ul class="sub-menu">
         <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-22457" id="menu-item-22457">
          <a href="http://dataunion.org/2016timeline">
           2016档期
          </a>
         </li>
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-22459" id="menu-item-22459">
          <a href="http://dataunion.org/category/parterc">
           合作会议
          </a>
         </li>
        </ul>
       </li>
       <li class="menu-item menu-item-type-taxonomy menu-item-object-category current-post-ancestor current-menu-parent current-post-parent menu-item-has-children menu-item-20869" id="menu-item-20869">
        <a href="http://dataunion.org/category/tech" title="articles">
         文章
        </a>
        <ul class="sub-menu">
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20867" id="menu-item-20867">
          <a href="http://dataunion.org/category/tech/base" title="base">
           基础架构
          </a>
         </li>
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-3302" id="menu-item-3302">
          <a href="http://dataunion.org/category/tech/ai" title="ai">
           人工智能
          </a>
         </li>
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-3303" id="menu-item-3303">
          <a href="http://dataunion.org/category/tech/analysis" title="analysis">
           数据分析
          </a>
         </li>
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-21920" id="menu-item-21920">
          <a href="http://dataunion.org/category/tech/dm">
           数据挖掘
          </a>
         </li>
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-3314" id="menu-item-3314">
          <a href="http://dataunion.org/category/tech/viz" title="viz">
           可视化
          </a>
         </li>
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-3305" id="menu-item-3305">
          <a href="http://dataunion.org/category/tech/devl" title="devl">
           编程语言
          </a>
         </li>
        </ul>
       </li>
       <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-20876" id="menu-item-20876">
        <a href="http://dataunion.org/category/industry">
         行业
        </a>
        <ul class="sub-menu">
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-16328" id="menu-item-16328">
          <a href="http://dataunion.org/category/industry/case" title="case">
           行业应用
          </a>
         </li>
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-2112" id="menu-item-2112">
          <a href="http://dataunion.org/category/industry/demo" title="demo">
           Demo展示
          </a>
         </li>
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-21562" id="menu-item-21562">
          <a href="http://dataunion.org/category/industry/news">
           行业资讯
          </a>
         </li>
        </ul>
       </li>
       <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-311" id="menu-item-311">
        <a href="http://dataunion.org/category/sources" title="sources">
         资源
        </a>
       </li>
       <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20870" id="menu-item-20870">
        <a href="http://dataunion.org/category/books" title="book">
         图书
        </a>
       </li>
       <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-21363" id="menu-item-21363">
        <a href="http://dataunion.org/category/training">
         课程
        </a>
       </li>
       <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-21853" id="menu-item-21853">
        <a href="http://dataunion.org/category/jobs">
         职位
        </a>
        <ul class="sub-menu">
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-22050" id="menu-item-22050">
          <a href="http://dataunion.org/category/career">
           职业规划
          </a>
         </li>
        </ul>
       </li>
      </ul>
     </nav>
     <!--header-nav-->
    </div>
   </header>
   <!--header-web-->
   <div id="main">
    <div id="soutab">
     <form action="http://dataunion.org/" class="search" method="get">
     </form>
    </div>
    <div id="container">
     <nav id="mbx">
      当前位置：
      <a href="http://dataunion.org">
       首页
      </a>
      &gt;
      <a href="http://dataunion.org/category/tech">
       文章
      </a>
      &gt;  正文
     </nav>
     <!--mbx-->
     <article class="content">
      <header align="centre" class="contenttitle">
       <div class="mscc">
        <h1 class="mscctitle">
         <a href="http://dataunion.org/20505.html">
          Kaggle上的一次比赛：利用机器学习进行恶意代码分类
         </a>
        </h1>
        <address class="msccaddress ">
         <em>
          2,608 次阅读 -
         </em>
         <a href="http://dataunion.org/category/tech" rel="category tag">
          文章
         </a>
        </address>
       </div>
      </header>
      <div class="content-text">
       <p>
        作者：
        <a class="author name ng-binding" href="http://drops.wooyun.org/author/bindog" target="_blank">
         bindog
        </a>
        出处：
        <a href="http://drops.wooyun.org/tips/8151?utm_source=tuicool">
         drops.wooyun.org
        </a>
       </p>
       <p>
        最近在Kaggle上微软发起了一个
        <a href="https://www.kaggle.com/c/malware-classification/">
         恶意代码分类的比赛
        </a>
        ，并提供了超过500G的数据(解压后)。有意思的是，取得第一名的队伍三个人都不是搞安全出身的，所采用的方法与我们常见的方法存在很大不同，展现了机器学习在安全领域的巨大潜力。在仔细读完他们的代码和相关的论文后，我简单的进行了一些总结与大家分享。
       </p>
       <p>
        需要指出的是，(1)比赛的主题是恶意代码的分类，不是病毒查杀(2)比赛采用的方法是纯静态分析的方法，不涉及行为分析等动态分析方法。
       </p>
       <p>
        因此这不意味着这个方法能够取代现有的方法，但是了解它能够为安全研究人员提供一个崭新的思路，至于能否在工业界应用仍待进一步研究。
       </p>
       <h1>
        0x01 总览
       </h1>
       <hr/>
       <h3>
        背景
       </h3>
       <p>
        80年代末期，随着恶意代码的诞生，反恶意代码软件（或称反病毒软件）随之诞生。这个时期的恶意代码所采用的技术较为简单，这使得对应的检测技术也较为容易，早期的反病毒软件大都单一的采用特征匹配的方法，简单的利用特征串完成检测。随着恶意代码技术的发展，恶意代码开始在传播过程中进行变形以躲避查杀，此时同一个恶意代码的变种数量急剧提升，形态较本体也发生了较大的变化，反病毒软件已经很难提取出一段代码作为恶意代码的特征码。在这种情况下，广谱特征码随之诞生，广谱特征码将特征码进行了分段，通过掩码字节对需要进行比较的和不需要进行比较的区段进行划分。然而无论是特征码扫描还是广谱特征，都需要在获得恶意代码样本后，进行特征的提取，随后才能进行检测，这使得对恶意代码的查杀具有一定的滞后性，始终走在恶意代码的后面。为了针对变种病毒和未知病毒，启发式扫描应运而生，启发式扫描利用已有的经验和知识对未知的二进制代码进行检测，这种技术抓住了恶意代码具有普通二进制文件所不具有的恶意行为，例如非常规读写文件，终结自身，非常规切入零环等等。启发式扫描的重点和难点在于如何对恶意代码的恶意行为特征进行提取。特征码扫描、查找广谱特征、启发式扫描，这三种查杀方式均没有实际运行二进制文件，因此均可归为恶意代码静态检测的方法。随着反恶意代码技术的逐步发展，主动防御技术、云查杀技术已越来越多的被安全厂商使用，但恶意代码静态检测的方法仍是效率最高，被运用最广泛的恶意代码查杀技术。
       </p>
       <h3>
        数据格式
       </h3>
       <p>
        微软提供的数据包括训练集、测试集和训练集的标注。其中每个恶意代码样本(去除了PE头)包含两个文件，一个是十六进制表示的
        <code>
         .bytes
        </code>
        文件，另一个是利用IDA反汇编工具生成的
        <code>
         .asm
        </code>
        文件。如下图所示
       </p>
       <p>
        <img src="http://static.wooyun.org//drops/20150819/2015081908421014077.png"/>
       </p>
       <h3>
        方法简述
       </h3>
       <p>
        Kaggle比赛中最重要的环节就是特征工程，特征的好坏直接决定了比赛成绩。在这次Kaggle的比赛中冠军队伍选取了三个“黄金”特征：恶意代码图像、
        <code>
         OpCode n-gram
        </code>
        和
        <code>
         Headers
        </code>
        个数，其他一些特征包括
        <code>
         ByteCode n-gram
        </code>
        ，指令频数等。机器学习部分采用了随机森林算法，并用到了
        <code>
         xgboost
        </code>
        和
        <code>
         pypy
        </code>
        加快训练速度。
       </p>
       <p>
        本文主要关注恶意代码图像和
        <code>
         OpCode n-gram
        </code>
        ，以及随机森林算法的应用。
       </p>
       <h1>
        0x02 恶意代码图像
       </h1>
       <hr/>
       <p>
        这个概念最早是2011年由加利福尼亚大学的
        <code>
         Nataraj
        </code>
        和
        <code>
         Karthikeyan
        </code>
        在他们的论文
        <code>
         Malware Images: Visualization and Automatic Classification
        </code>
        中提出来的，思路非常新颖，把一个二进制文件以灰度图的形式展现出来，利用图像中的纹理特征对恶意代码进行聚类。此后，有许多研究人员在这个思路基础上进行了改进和探索。就目前发表的文章来看，恶意代码图像的形式并不固定，研究人员可根据实际情况进行调整和创新。
       </p>
       <p>
        国内这方面的研究较少，去年在通信学报上有一篇
        <code>
         《基于纹理指纹的恶意代码变种检测方法研究》
        </code>
        ，是由北京科技大学的韩晓光博士和北京启明星辰研究院等合作发表的，目测也是仅有的一篇。
       </p>
       <p>
        本节介绍最简单的一种恶意代码图像绘制方法。对一个二进制文件，每个字节范围在00~FF之间，刚好对应灰度图0~255(0为黑色，255为白色)。将一个二进制文件转换为一个矩阵(矩阵元素对应文件中的每一个字节，矩阵的大小可根据实际情况进行调整)，该矩阵又可以非常方便的转换为一张灰度图。
       </p>
       <p>
        python代码如下
       </p>
       <div>
        <div class="syntaxhighlighter python" id="highlighter_853276">
         <table border="0" cellpadding="0" cellspacing="0">
          <tbody>
           <tr>
            <td class="gutter">
             <div class="line number1 index0 alt2">
              1
             </div>
             <div class="line number2 index1 alt1">
              2
             </div>
             <div class="line number3 index2 alt2">
              3
             </div>
             <div class="line number4 index3 alt1">
              4
             </div>
             <div class="line number5 index4 alt2">
              5
             </div>
             <div class="line number6 index5 alt1">
              6
             </div>
             <div class="line number7 index6 alt2">
              7
             </div>
             <div class="line number8 index7 alt1">
              8
             </div>
             <div class="line number9 index8 alt2">
              9
             </div>
             <div class="line number10 index9 alt1">
              10
             </div>
             <div class="line number11 index10 alt2">
              11
             </div>
             <div class="line number12 index11 alt1">
              12
             </div>
             <div class="line number13 index12 alt2">
              13
             </div>
             <div class="line number14 index13 alt1">
              14
             </div>
             <div class="line number15 index14 alt2">
              15
             </div>
            </td>
            <td class="code">
             <div class="container">
              <div class="line number1 index0 alt2">
               <code class="python keyword">
                import
               </code>
               <code class="python plain">
                numpy
               </code>
              </div>
              <div class="line number2 index1 alt1">
               <code class="python keyword">
                from
               </code>
               <code class="python plain">
                PIL
               </code>
               <code class="python keyword">
                import
               </code>
               <code class="python plain">
                Image
               </code>
              </div>
              <div class="line number3 index2 alt2">
               <code class="python keyword">
                import
               </code>
               <code class="python plain">
                binascii
               </code>
              </div>
              <div class="line number4 index3 alt1">
               <code class="python keyword">
                def
               </code>
               <code class="python plain">
                getMatrixfrom_bin(filename,width):
               </code>
              </div>
              <div class="line number5 index4 alt2">
               <code class="python spaces">
               </code>
               <code class="python plain">
                with
               </code>
               <code class="python functions">
                open
               </code>
               <code class="python plain">
                (filename,
               </code>
               <code class="python string">
                'rb'
               </code>
               <code class="python plain">
                ) as f:
               </code>
              </div>
              <div class="line number6 index5 alt1">
               <code class="python spaces">
               </code>
               <code class="python plain">
                content
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python plain">
                f.read()
               </code>
              </div>
              <div class="line number7 index6 alt2">
               <code class="python spaces">
               </code>
               <code class="python plain">
                hexst
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python plain">
                binascii.hexlify(content)
               </code>
               <code class="python comments">
                #将二进制文件转换为十六进制字符串
               </code>
              </div>
              <div class="line number8 index7 alt1">
               <code class="python spaces">
               </code>
               <code class="python plain">
                fh
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python plain">
                numpy.array([
               </code>
               <code class="python functions">
                int
               </code>
               <code class="python plain">
                (hexst[i:i
               </code>
               <code class="python keyword">
                +
               </code>
               <code class="python value">
                2
               </code>
               <code class="python plain">
                ],
               </code>
               <code class="python value">
                16
               </code>
               <code class="python plain">
                )
               </code>
               <code class="python keyword">
                for
               </code>
               <code class="python plain">
                i
               </code>
               <code class="python keyword">
                in
               </code>
               <code class="python functions">
                range
               </code>
               <code class="python plain">
                (
               </code>
               <code class="python value">
                0
               </code>
               <code class="python plain">
                ,
               </code>
               <code class="python functions">
                len
               </code>
               <code class="python plain">
                (hexst),
               </code>
               <code class="python value">
                2
               </code>
               <code class="python plain">
                )])
               </code>
               <code class="python comments">
                #按字节分割
               </code>
              </div>
              <div class="line number9 index8 alt2">
               <code class="python spaces">
               </code>
               <code class="python plain">
                rn
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python functions">
                len
               </code>
               <code class="python plain">
                (fh)
               </code>
               <code class="python keyword">
                /
               </code>
               <code class="python plain">
                width
               </code>
              </div>
              <div class="line number10 index9 alt1">
               <code class="python spaces">
               </code>
               <code class="python plain">
                fh
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python plain">
                numpy.reshape(fh[:rn
               </code>
               <code class="python keyword">
                *
               </code>
               <code class="python plain">
                width],(
               </code>
               <code class="python keyword">
                -
               </code>
               <code class="python value">
                1
               </code>
               <code class="python plain">
                ,width))
               </code>
               <code class="python comments">
                #根据设定的宽度生成矩阵
               </code>
              </div>
              <div class="line number11 index10 alt2">
               <code class="python spaces">
               </code>
               <code class="python plain">
                fh
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python plain">
                numpy.uint8(fh)
               </code>
              </div>
              <div class="line number12 index11 alt1">
               <code class="python spaces">
               </code>
               <code class="python keyword">
                return
               </code>
               <code class="python plain">
                fh
               </code>
              </div>
              <div class="line number13 index12 alt2">
               <code class="python plain">
                filename
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python string">
                "your_bin_filename"
               </code>
              </div>
              <div class="line number14 index13 alt1">
               <code class="python plain">
                im
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python plain">
                Image.fromarray(getMatrixfrom_bin(filename,
               </code>
               <code class="python value">
                512
               </code>
               <code class="python plain">
                ))
               </code>
               <code class="python comments">
                #转换为图像
               </code>
              </div>
              <div class="line number15 index14 alt2">
               <code class="python plain">
                im.save(
               </code>
               <code class="python string">
                "your_img_filename.png"
               </code>
               <code class="python plain">
                )
               </code>
              </div>
             </div>
            </td>
           </tr>
          </tbody>
         </table>
        </div>
       </div>
       <p>
        利用该代码生成的几种病毒样本图像如下所示
       </p>
       <p>
        <img src="http://static.wooyun.org//drops/20150819/2015081908421089907.png"/>
       </p>
       <p>
        用肉眼可看出，同一个家族的恶意代码图像在纹理上存在一定的相似性，不同的恶意代码家族是有一定区别的。如何用计算机发现和提取这些纹理的相似特征用以分类呢？这就需要用到计算机视觉里的一些技术了。在
        <code>
         Nataraj
        </code>
        和
        <code>
         Karthikeyan
        </code>
        的论文中采用的是
        <code>
         GIST特征
        </code>
        ，
        <code>
         GIST特征
        </code>
        常用于场景分类任务(如城市、森林、公路和海滩等)，用一个五维的感知维度来代表一个场景的主要内容(详情请参考文献[xx])。简单来说，输入图像，输出为对应的GIST描述符，如下图所示
       </p>
       <p>
        <img src="http://static.wooyun.org//drops/20150819/2015081908421348858.jpg"/>
       </p>
       <p>
        在
        <code>
         matlab
        </code>
        实现里面每个图像的GIST描述符都用一个向量表示，最后用
        <code>
         SVM
        </code>
        完成分类训练。
       </p>
       <p>
        <img src="http://static.wooyun.org//drops/20150819/2015081908421385904.png"/>
       </p>
       <p>
        这已经远远超出了场景识别所能做的。不过，国外有学者利用一些类似前文生成那种不规则图像来欺骗深度学习模型，如下图所示
       </p>
       <p>
        <img src="http://static.wooyun.org//drops/20150819/2015081908421463474.png"/>
       </p>
       <p>
        详情请参考
        <a href="http://weibo.com/u/1657470871">
         @王威廉
        </a>
        老师的
        <a href="http://www.weibo.com/1657470871/BA2q8s0Vd?type=comment#_rnd1439964425558">
         微博
        </a>
        。当然，二者并没有什么直接关联，因为基于深度学习的图像识别系统的训练数据是一些有意义的图像。但这是一个非常有意思的巧合，至于基于深度学习的图像识别能否用于恶意代码图像的特征提取和分类，我认为是一个潜在的研究点，所能做的也不局限于此，如果有做深度学习的朋友可以伙同做安全的朋友一起研究交流。
       </p>
       <blockquote>
        <p style="text-align: center;">
         看数据精华，关注数盟微信
        </p>
        <p>
         <a data-original-title="" href="http://dataunion.org/wp-content/uploads/2015/08/weixin.jpg" title="">
          <img src="http://dataunion.org/wp-content/uploads/2015/08/weixin.jpg"/>
         </a>
        </p>
       </blockquote>
       <h1>
        0x03 OpCode n-gram
       </h1>
       <hr/>
       <p>
        <code>
         n-gram
        </code>
        是自然语言处理领域的概念，早期的语音识别技术和统计语言模型与它密不可分。
        <code>
         n-gram
        </code>
        基于一个简单的假设，即认为一个词出现的概率仅与它之前的n-1个词有关，这个概率可从大量语料中统计得到。例如“吃”的后面出现“苹果”或“披萨”的概率就会比“公路”的概率大(正常的语料中基本不会出现“吃公路”这种组合)，可以看出
        <code>
         n-gram
        </code>
        在一定程度上包含了部分语言特征。
       </p>
       <p>
        将
        <code>
         n-gra
        </code>
        m应用于恶意代码识别的想法最早由Tony等人在2004年的论文
        <code>
         N-gram-based Detection of New Malicious Code
        </code>
        中提出，不过他们的方法是基于
        <code>
         ByteCode
        </code>
        的。2008年
        <code>
         Moskovitch
        </code>
        等人的论文
        <code>
         Unknown Malcode Detection Using OPCODE Representation
        </code>
        中提出利用
        <code>
         OpCode
        </code>
        代替
        <code>
         ByteCode
        </code>
        更加科学。
       </p>
       <p>
        具体来说，一个二进制文件的
        <code>
         OpCode n-gram
        </code>
        如下图所示
       </p>
       <p>
        <img src="http://static.wooyun.org//drops/20150819/2015081908421525407.png"/>
       </p>
       <p>
        针对这次Kaggle比赛提供的数据，用python提取出其n-gram特征
       </p>
       <div>
        <div class="syntaxhighlighter python" id="highlighter_953050">
         <table border="0" cellpadding="0" cellspacing="0">
          <tbody>
           <tr>
            <td class="gutter">
             <div class="line number1 index0 alt2">
              1
             </div>
             <div class="line number2 index1 alt1">
              2
             </div>
             <div class="line number3 index2 alt2">
              3
             </div>
             <div class="line number4 index3 alt1">
              4
             </div>
             <div class="line number5 index4 alt2">
              5
             </div>
             <div class="line number6 index5 alt1">
              6
             </div>
             <div class="line number7 index6 alt2">
              7
             </div>
             <div class="line number8 index7 alt1">
              8
             </div>
             <div class="line number9 index8 alt2">
              9
             </div>
             <div class="line number10 index9 alt1">
              10
             </div>
             <div class="line number11 index10 alt2">
              11
             </div>
             <div class="line number12 index11 alt1">
              12
             </div>
             <div class="line number13 index12 alt2">
              13
             </div>
             <div class="line number14 index13 alt1">
              14
             </div>
             <div class="line number15 index14 alt2">
              15
             </div>
             <div class="line number16 index15 alt1">
              16
             </div>
             <div class="line number17 index16 alt2">
              17
             </div>
             <div class="line number18 index17 alt1">
              18
             </div>
             <div class="line number19 index18 alt2">
              19
             </div>
             <div class="line number20 index19 alt1">
              20
             </div>
             <div class="line number21 index20 alt2">
              21
             </div>
             <div class="line number22 index21 alt1">
              22
             </div>
             <div class="line number23 index22 alt2">
              23
             </div>
             <div class="line number24 index23 alt1">
              24
             </div>
             <div class="line number25 index24 alt2">
              25
             </div>
             <div class="line number26 index25 alt1">
              26
             </div>
            </td>
            <td class="code">
             <div class="container">
              <div class="line number1 index0 alt2">
               <code class="python keyword">
                import
               </code>
               <code class="python plain">
                re
               </code>
              </div>
              <div class="line number2 index1 alt1">
               <code class="python keyword">
                from
               </code>
               <code class="python plain">
                collections
               </code>
               <code class="python keyword">
                import
               </code>
               <code class="python keyword">
                *
               </code>
              </div>
              <div class="line number3 index2 alt2">
               <code class="python comments">
                # 从.asm文件获取Opcode序列
               </code>
              </div>
              <div class="line number4 index3 alt1">
               <code class="python keyword">
                def
               </code>
               <code class="python plain">
                getOpcodeSequence(filename):
               </code>
              </div>
              <div class="line number5 index4 alt2">
               <code class="python spaces">
               </code>
               <code class="python plain">
                opcode_seq
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python plain">
                []
               </code>
              </div>
              <div class="line number6 index5 alt1">
               <code class="python spaces">
               </code>
               <code class="python plain">
                p
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python plain">
                re.
               </code>
               <code class="python functions">
                compile
               </code>
               <code class="python plain">
                (r
               </code>
               <code class="python string">
                '\s([a-fA-F0-9]{2}\s)+\s*([a-z]+)'
               </code>
               <code class="python plain">
                )
               </code>
              </div>
              <div class="line number7 index6 alt2">
               <code class="python spaces">
               </code>
               <code class="python plain">
                with
               </code>
               <code class="python functions">
                open
               </code>
               <code class="python plain">
                (filename) as f:
               </code>
              </div>
              <div class="line number8 index7 alt1">
               <code class="python spaces">
               </code>
               <code class="python keyword">
                for
               </code>
               <code class="python plain">
                line
               </code>
               <code class="python keyword">
                in
               </code>
               <code class="python plain">
                f:
               </code>
              </div>
              <div class="line number9 index8 alt2">
               <code class="python spaces">
               </code>
               <code class="python keyword">
                if
               </code>
               <code class="python plain">
                line.startswith(
               </code>
               <code class="python string">
                ".text"
               </code>
               <code class="python plain">
                ):
               </code>
              </div>
              <div class="line number10 index9 alt1">
               <code class="python spaces">
               </code>
               <code class="python plain">
                m
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python plain">
                re.findall(p,line)
               </code>
              </div>
              <div class="line number11 index10 alt2">
               <code class="python spaces">
               </code>
               <code class="python keyword">
                if
               </code>
               <code class="python plain">
                m:
               </code>
              </div>
              <div class="line number12 index11 alt1">
               <code class="python spaces">
               </code>
               <code class="python plain">
                opc
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python plain">
                m[
               </code>
               <code class="python value">
                0
               </code>
               <code class="python plain">
                ][
               </code>
               <code class="python value">
                10
               </code>
               <code class="python plain">
                ]
               </code>
              </div>
              <div class="line number13 index12 alt2">
               <code class="python spaces">
               </code>
               <code class="python keyword">
                if
               </code>
               <code class="python plain">
                opc !
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python string">
                "align"
               </code>
               <code class="python plain">
                :
               </code>
              </div>
              <div class="line number14 index13 alt1">
               <code class="python spaces">
               </code>
               <code class="python plain">
                opcode_seq.append(opc)
               </code>
              </div>
              <div class="line number15 index14 alt2">
               <code class="python spaces">
               </code>
               <code class="python keyword">
                return
               </code>
               <code class="python plain">
                opcode_seq
               </code>
              </div>
              <div class="line number16 index15 alt1">
               <code class="python comments">
                # 根据Opcode序列，统计对应的n-gram
               </code>
              </div>
              <div class="line number17 index16 alt2">
               <code class="python keyword">
                def
               </code>
               <code class="python plain">
                getOpcodeNgram(ops ,n
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python value">
                3
               </code>
               <code class="python plain">
                ):
               </code>
              </div>
              <div class="line number18 index17 alt1">
               <code class="python spaces">
               </code>
               <code class="python plain">
                opngramlist
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python plain">
                [
               </code>
               <code class="python functions">
                tuple
               </code>
               <code class="python plain">
                (ops[i:i
               </code>
               <code class="python keyword">
                +
               </code>
               <code class="python plain">
                n])
               </code>
               <code class="python keyword">
                for
               </code>
               <code class="python plain">
                i
               </code>
               <code class="python keyword">
                in
               </code>
               <code class="python functions">
                range
               </code>
               <code class="python plain">
                (
               </code>
               <code class="python functions">
                len
               </code>
               <code class="python plain">
                (ops)
               </code>
               <code class="python keyword">
                -
               </code>
               <code class="python plain">
                n)]
               </code>
              </div>
              <div class="line number19 index18 alt2">
               <code class="python spaces">
               </code>
               <code class="python plain">
                opngram
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python plain">
                Counter(opngramlist)
               </code>
              </div>
              <div class="line number20 index19 alt1">
               <code class="python spaces">
               </code>
               <code class="python keyword">
                return
               </code>
               <code class="python plain">
                opngram
               </code>
              </div>
              <div class="line number21 index20 alt2">
               <code class="python functions">
                file
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python string">
                "train/0A32eTdBKayjCWhZqDOQ.asm"
               </code>
              </div>
              <div class="line number22 index21 alt1">
               <code class="python plain">
                ops
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python plain">
                getOpcodeSequence(
               </code>
               <code class="python functions">
                file
               </code>
               <code class="python plain">
                )
               </code>
              </div>
              <div class="line number23 index22 alt2">
               <code class="python plain">
                opngram
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python plain">
                getOpcodeNgram(ops)
               </code>
              </div>
              <div class="line number24 index23 alt1">
               <code class="python functions">
                print
               </code>
               <code class="python plain">
                opngram
               </code>
              </div>
              <div class="line number25 index24 alt2">
               <code class="python comments">
                # output
               </code>
              </div>
              <div class="line number26 index25 alt1">
               <code class="python comments">
                # Counter({('mov', 'mov', 'mov'): 164, ('xor', 'test', 'setnle'): 155...
               </code>
              </div>
             </div>
            </td>
           </tr>
          </tbody>
         </table>
        </div>
       </div>
       <h1>
        0x04 决策树和随机森林
       </h1>
       <hr/>
       <h3>
        决策树
       </h3>
       <p>
        决策树在我们日常生活中无处不在，在众多机器学习的书籍中提到的一个例子(银行预测客户是否有能力偿还贷款)如下图所示
       </p>
       <p>
        <img src="http://static.wooyun.org//drops/20150819/2015081908421530130.png"/>
       </p>
       <p>
        在这个在决策树中，非叶子结点如“拥有房产”、“是否结婚”就是所谓的特征，它们是依靠我们的知识人工提取出来的特征。但如果对某个领域不了解，特征数量又较多时，人工提取特征的方法就不可行了，需要依靠算法来寻找合适的特征构造决策树。
       </p>
       <p>
        限于篇幅，决策树的构造等过程本文不进行展开，网上相关资源非常多。(只要能够充分理解熵和信息增益的概念，决策树其实非常简单)
       </p>
       <h3>
        随机森林
       </h3>
       <p>
        随机森林是一个非常强大的机器学习方法，顾名思义，它是用随机的方式建立一个森林，森林里面有很多的决策树组成，随机森林的每一棵决策树之间是没有关联的。在得到森林之后，当有一个新的输入样本进入的时候，就让森林中的每一棵决策树分别进行一下判断，预测这个样本应该属于哪一类（对于分类算法），然后看看哪一类被选择最多，就预测这个样本为那一类。
       </p>
       <p>
        随机森林的思想与
        <code>
         Adaboost
        </code>
        里面的弱分类器组合成强分类器的思想类似，是一种“集体智慧”的体现。例如，屋子里面有n个人，每个人作出正确判断的概率为p(p略高于0.5,这时每个人可视为一个弱分类器)，他们判断的过程独立互不影响，最终以多数人的判断为准。这里我们不从数学上来推导，类比抛硬币，对一枚均匀的硬币，抛n次的结果中，正面和反面的次数是差不多的。而对一枚不均匀的硬币，若出现正面的概率略大于反面，抛n次的结果中出现正面次数比反面次数多的概率就会很大。所以即使每个分类器的准确度不高，但是结合在一起时就可以变成一个强分类器。
       </p>
       <p>
        <img src="http://static.wooyun.org//drops/20150819/2015081908421586170.jpg"/>
       </p>
       <p>
        如图所示，将训练数据有放回的抽样出多个子集(即随机选择矩阵中的行)，当然在特征选择上也可以进行随机化(即随机选择矩阵中的列，图中没有体现出来)，分别在每个子集上生成对应的决策树
       </p>
       <p>
        <img src="http://static.wooyun.org//drops/20150819/2015081908421637777.png"/>
       </p>
       <p>
        决策过程如下图所示(忽略画风不一致的问题…)
       </p>
       <p>
        <img src="http://static.wooyun.org//drops/20150819/2015081908421784702.png"/>
       </p>
       <h1>
        0x05 冠军队伍的实现细节
       </h1>
       <hr/>
       <h3>
        ASM文件图像
       </h3>
       <p>
        但是在
        <code>
         Kaggle
        </code>
        比赛中冠军队伍采用的方法并不是从二进制文件生成的图像，也不是从
        <code>
         .bytes
        </code>
        文件，竟然是从
        <code>
         .asm
        </code>
        文件生成的图像，他们也没有使用GIST特征，而是使用了前800个像素值作为特征，让人非常费解。
       </p>
       <p>
        我专门给队伍里的
        <code>
         Jiwei Liu
        </code>
        同学发了一封邮件进行咨询，他给我的答复是：
        <code>
         GIST特征
        </code>
        与其他特征综合使用时影响整体效果，所以他们放弃了
        <code>
         GIST特征
        </code>
        ，另外使用
        <code>
         .asm
        </code>
        文件生成图像纯属意外发现…
       </p>
       <p>
        至于为什么是前800个像素，他的解释是通过反复交叉验证得出的，具体原因不清楚。(在后文的分析中我会谈谈我的一些看法)
       </p>
       <h3>
        OpCode n-gram
       </h3>
       <p>
        这部分的实现不复杂，他们选取n=4，在具体的特征选择上通过计算信息增益选取每个分类与其他分类区分度最高的750个特征。
       </p>
       <h3>
        其他特征
       </h3>
       <p>
        其他一些特征包括统计
        <code>
         Headers，Bytecode n-gram(n=2,3,4)
        </code>
        ，分析指令流(将每个循环固定展开5次)来统计指令频数，这些特征虽然不像前面提到的特征那么有效，但是确实可以在一定程度上提升最终成绩。
       </p>
       <h1>
        0x06 实验
       </h1>
       <hr/>
       <p>
        冠军队伍的代码是为了参加比赛而写的，时间仓促，又是多人合作完成，导致组织结构很乱，且基本没有注释，可读性较差。更重要的是自己想动手实践一下，所以按照他们的思路写了几个简单的程序，忽略了一些处理起来比较复杂或者难以理解的过程，代码可以在我的github上下载
       </p>
       <p>
        由于只是做一些简单的试验，不需要太多的数据(否则速度会非常慢)，我从微软提供的训练数据中抽取了大概1/10左右的训练子集，其中从每个分类的中都随机抽取了100个样本(9个分类，每个样本2个文件，共1800个文件)，这样也不需要用到
        <code>
         pypy
        </code>
        和
        <code>
         xgboost
        </code>
        ，只需要用到
        <code>
         numpy
        </code>
        、
        <code>
         pandas
        </code>
        、
        <code>
         PIL
        </code>
        和
        <code>
         scikit-learn
        </code>
        这些库即可
       </p>
       <p>
        友情提示：要进行这个实验，首先确保有一个比较大的硬盘，推荐使用Linux系统。
       </p>
       <h3>
        训练子集
       </h3>
       <p>
        这一步需要提前将完整训练集解压好，数量庞大，时间比较久。
       </p>
       <div>
        <div class="syntaxhighlighter python" id="highlighter_292244">
         <table border="0" cellpadding="0" cellspacing="0">
          <tbody>
           <tr>
            <td class="gutter">
             <div class="line number1 index0 alt2">
              1
             </div>
             <div class="line number2 index1 alt1">
              2
             </div>
             <div class="line number3 index2 alt2">
              3
             </div>
             <div class="line number4 index3 alt1">
              4
             </div>
             <div class="line number5 index4 alt2">
              5
             </div>
             <div class="line number6 index5 alt1">
              6
             </div>
             <div class="line number7 index6 alt2">
              7
             </div>
             <div class="line number8 index7 alt1">
              8
             </div>
             <div class="line number9 index8 alt2">
              9
             </div>
             <div class="line number10 index9 alt1">
              10
             </div>
             <div class="line number11 index10 alt2">
              11
             </div>
             <div class="line number12 index11 alt1">
              12
             </div>
             <div class="line number13 index12 alt2">
              13
             </div>
             <div class="line number14 index13 alt1">
              14
             </div>
             <div class="line number15 index14 alt2">
              15
             </div>
             <div class="line number16 index15 alt1">
              16
             </div>
             <div class="line number17 index16 alt2">
              17
             </div>
             <div class="line number18 index17 alt1">
              18
             </div>
             <div class="line number19 index18 alt2">
              19
             </div>
             <div class="line number20 index19 alt1">
              20
             </div>
             <div class="line number21 index20 alt2">
              21
             </div>
             <div class="line number22 index21 alt1">
              22
             </div>
             <div class="line number23 index22 alt2">
              23
             </div>
             <div class="line number24 index23 alt1">
              24
             </div>
             <div class="line number25 index24 alt2">
              25
             </div>
             <div class="line number26 index25 alt1">
              26
             </div>
             <div class="line number27 index26 alt2">
              27
             </div>
             <div class="line number28 index27 alt1">
              28
             </div>
             <div class="line number29 index28 alt2">
              29
             </div>
             <div class="line number30 index29 alt1">
              30
             </div>
            </td>
            <td class="code">
             <div class="container">
              <div class="line number1 index0 alt2">
               <code class="python keyword">
                import
               </code>
               <code class="python plain">
                os
               </code>
              </div>
              <div class="line number2 index1 alt1">
               <code class="python keyword">
                from
               </code>
               <code class="python plain">
                random
               </code>
               <code class="python keyword">
                import
               </code>
               <code class="python keyword">
                *
               </code>
              </div>
              <div class="line number3 index2 alt2">
               <code class="python keyword">
                import
               </code>
               <code class="python plain">
                pandas as pd
               </code>
              </div>
              <div class="line number4 index3 alt1">
               <code class="python keyword">
                import
               </code>
               <code class="python plain">
                shutil
               </code>
              </div>
              <div class="line number5 index4 alt2">
               <code class="python plain">
                rs
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python plain">
                Random()
               </code>
              </div>
              <div class="line number6 index5 alt1">
               <code class="python comments">
                # 读取微软提供的训练集标注
               </code>
              </div>
              <div class="line number7 index6 alt2">
               <code class="python plain">
                trainlabels
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python plain">
                pd.read_csv(
               </code>
               <code class="python string">
                'trainLabels.csv'
               </code>
               <code class="python plain">
                )
               </code>
              </div>
              <div class="line number8 index7 alt1">
               <code class="python plain">
                fids
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python plain">
                []
               </code>
              </div>
              <div class="line number9 index8 alt2">
               <code class="python plain">
                opd
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python plain">
                pd.DataFrame()
               </code>
              </div>
              <div class="line number10 index9 alt1">
               <code class="python keyword">
                for
               </code>
               <code class="python plain">
                clabel
               </code>
               <code class="python keyword">
                in
               </code>
               <code class="python functions">
                range
               </code>
               <code class="python plain">
                (
               </code>
               <code class="python value">
                1
               </code>
               <code class="python plain">
                ,
               </code>
               <code class="python value">
                10
               </code>
               <code class="python plain">
                ):
               </code>
              </div>
              <div class="line number11 index10 alt2">
               <code class="python spaces">
               </code>
               <code class="python comments">
                # 筛选特定分类
               </code>
              </div>
              <div class="line number12 index11 alt1">
               <code class="python spaces">
               </code>
               <code class="python plain">
                mids
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python plain">
                trainlabels[trainlabels.Class
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python plain">
                clabel]
               </code>
              </div>
              <div class="line number13 index12 alt2">
               <code class="python spaces">
               </code>
               <code class="python plain">
                mids
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python plain">
                mids.reset_index(drop
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python color1">
                True
               </code>
               <code class="python plain">
                )
               </code>
              </div>
              <div class="line number14 index13 alt1">
               <code class="python spaces">
               </code>
               <code class="python comments">
                # 在该分类下随机抽取100个
               </code>
              </div>
              <div class="line number15 index14 alt2">
               <code class="python spaces">
               </code>
               <code class="python plain">
                rchoice
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python plain">
                [rs.randint(
               </code>
               <code class="python value">
                0
               </code>
               <code class="python plain">
                ,
               </code>
               <code class="python functions">
                len
               </code>
               <code class="python plain">
                (mids)
               </code>
               <code class="python keyword">
                -
               </code>
               <code class="python value">
                1
               </code>
               <code class="python plain">
                )
               </code>
               <code class="python keyword">
                for
               </code>
               <code class="python plain">
                i
               </code>
               <code class="python keyword">
                in
               </code>
               <code class="python functions">
                range
               </code>
               <code class="python plain">
                (
               </code>
               <code class="python value">
                100
               </code>
               <code class="python plain">
                )]
               </code>
              </div>
              <div class="line number16 index15 alt1">
               <code class="python spaces">
               </code>
               <code class="python plain">
                rids
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python plain">
                [mids.loc[i].
               </code>
               <code class="python functions">
                Id
               </code>
               <code class="python keyword">
                for
               </code>
               <code class="python plain">
                i
               </code>
               <code class="python keyword">
                in
               </code>
               <code class="python plain">
                rchoice]
               </code>
              </div>
              <div class="line number17 index16 alt2">
               <code class="python spaces">
               </code>
               <code class="python plain">
                fids.extend(rids)
               </code>
              </div>
              <div class="line number18 index17 alt1">
               <code class="python spaces">
               </code>
               <code class="python plain">
                opd
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python plain">
                opd.append(mids.loc[rchoice])
               </code>
              </div>
              <div class="line number19 index18 alt2">
               <code class="python plain">
                opd
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python plain">
                opd.reset_index(drop
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python color1">
                True
               </code>
               <code class="python plain">
                )
               </code>
              </div>
              <div class="line number20 index19 alt1">
               <code class="python comments">
                # 生成训练子集标注
               </code>
              </div>
              <div class="line number21 index20 alt2">
               <code class="python plain">
                opd.to_csv(
               </code>
               <code class="python string">
                'subtrainLabels.csv'
               </code>
               <code class="python plain">
                , encoding
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python string">
                'utf-8'
               </code>
               <code class="python plain">
                , index
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python color1">
                False
               </code>
               <code class="python plain">
                )
               </code>
              </div>
              <div class="line number22 index21 alt1">
               <code class="python comments">
                # 将训练子集拷贝出来(根据实际情况修改这个路径)
               </code>
              </div>
              <div class="line number23 index22 alt2">
               <code class="python plain">
                sbase
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python string">
                'yourpath/train/'
               </code>
              </div>
              <div class="line number24 index23 alt1">
               <code class="python plain">
                tbase
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python string">
                'yourpath/subtrain/'
               </code>
              </div>
              <div class="line number25 index24 alt2">
               <code class="python keyword">
                for
               </code>
               <code class="python plain">
                fid
               </code>
               <code class="python keyword">
                in
               </code>
               <code class="python plain">
                fids:
               </code>
              </div>
              <div class="line number26 index25 alt1">
               <code class="python spaces">
               </code>
               <code class="python plain">
                fnames
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python plain">
                [
               </code>
               <code class="python string">
                '{0}.asm'
               </code>
               <code class="python plain">
                .
               </code>
               <code class="python functions">
                format
               </code>
               <code class="python plain">
                (fid),
               </code>
               <code class="python string">
                '{0}.bytes'
               </code>
               <code class="python plain">
                .
               </code>
               <code class="python functions">
                format
               </code>
               <code class="python plain">
                (fid)]
               </code>
              </div>
              <div class="line number27 index26 alt2">
               <code class="python spaces">
               </code>
               <code class="python keyword">
                for
               </code>
               <code class="python plain">
                fname
               </code>
               <code class="python keyword">
                in
               </code>
               <code class="python plain">
                fnames:
               </code>
              </div>
              <div class="line number28 index27 alt1">
               <code class="python spaces">
               </code>
               <code class="python plain">
                cspath
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python plain">
                sbase
               </code>
               <code class="python keyword">
                +
               </code>
               <code class="python plain">
                fname
               </code>
              </div>
              <div class="line number29 index28 alt2">
               <code class="python spaces">
               </code>
               <code class="python plain">
                ctpath
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python plain">
                tbase
               </code>
               <code class="python keyword">
                +
               </code>
               <code class="python plain">
                fname
               </code>
              </div>
              <div class="line number30 index29 alt1">
               <code class="python spaces">
               </code>
               <code class="python plain">
                shutil.copy(cspath,ctpath)
               </code>
              </div>
             </div>
            </td>
           </tr>
          </tbody>
         </table>
        </div>
       </div>
       <h3>
        特征抽取
       </h3>
       <p>
        本实验中只用到了
        <code>
         .asm
        </code>
        文件，用到了
        <code>
         .asm
        </code>
        文件图像特征(前1500个像素)和
        <code>
         OpCode n-gram特征
        </code>
        (本实验取n=3,将总体出现频数大于500次的3-gram作为特征保留)，实现代码与前文基本一致，具体细节可参考完整代码。
       </p>
       <h3>
        scikit-learn
       </h3>
       <p>
        因为
        <code>
         scikit-learn
        </code>
        的存在，将机器学习算法应用到其他领域变得非常方便快捷。例如我们已经抽取了这些恶意代码的
        <code>
         OpCode n-gram
        </code>
        特征(“
        <code>
         3gramfeature.csv
        </code>
        “)，利用
        <code>
         scikit-learn
        </code>
        即可快速训练一个随机森林
       </p>
       <div>
        <div class="syntaxhighlighter python" id="highlighter_283390">
         <table border="0" cellpadding="0" cellspacing="0">
          <tbody>
           <tr>
            <td class="gutter">
             <div class="line number1 index0 alt2">
              1
             </div>
             <div class="line number2 index1 alt1">
              2
             </div>
             <div class="line number3 index2 alt2">
              3
             </div>
             <div class="line number4 index3 alt1">
              4
             </div>
             <div class="line number5 index4 alt2">
              5
             </div>
             <div class="line number6 index5 alt1">
              6
             </div>
             <div class="line number7 index6 alt2">
              7
             </div>
             <div class="line number8 index7 alt1">
              8
             </div>
             <div class="line number9 index8 alt2">
              9
             </div>
             <div class="line number10 index9 alt1">
              10
             </div>
             <div class="line number11 index10 alt2">
              11
             </div>
             <div class="line number12 index11 alt1">
              12
             </div>
             <div class="line number13 index12 alt2">
              13
             </div>
             <div class="line number14 index13 alt1">
              14
             </div>
             <div class="line number15 index14 alt2">
              15
             </div>
             <div class="line number16 index15 alt1">
              16
             </div>
            </td>
            <td class="code">
             <div class="container">
              <div class="line number1 index0 alt2">
               <code class="python keyword">
                from
               </code>
               <code class="python plain">
                sklearn.ensemble
               </code>
               <code class="python keyword">
                import
               </code>
               <code class="python plain">
                RandomForestClassifier as RF
               </code>
              </div>
              <div class="line number2 index1 alt1">
               <code class="python keyword">
                from
               </code>
               <code class="python plain">
                sklearn
               </code>
               <code class="python keyword">
                import
               </code>
               <code class="python plain">
                cross_validation
               </code>
              </div>
              <div class="line number3 index2 alt2">
               <code class="python keyword">
                from
               </code>
               <code class="python plain">
                sklearn.metrics
               </code>
               <code class="python keyword">
                import
               </code>
               <code class="python plain">
                confusion_matrix
               </code>
              </div>
              <div class="line number4 index3 alt1">
               <code class="python keyword">
                import
               </code>
               <code class="python plain">
                pandas as pd
               </code>
              </div>
              <div class="line number5 index4 alt2">
               <code class="python plain">
                subtrainLabel
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python plain">
                pd.read_csv(
               </code>
               <code class="python string">
                'subtrainLabels.csv'
               </code>
               <code class="python plain">
                )
               </code>
              </div>
              <div class="line number6 index5 alt1">
               <code class="python plain">
                subtrainfeature
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python plain">
                pd.read_csv(
               </code>
               <code class="python string">
                "3gramfeature.csv"
               </code>
               <code class="python plain">
                )
               </code>
              </div>
              <div class="line number7 index6 alt2">
               <code class="python plain">
                subtrain
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python plain">
                pd.merge(subtrainLabel,subtrainfeature,on
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python string">
                'Id'
               </code>
               <code class="python plain">
                )
               </code>
              </div>
              <div class="line number8 index7 alt1">
               <code class="python plain">
                labels
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python plain">
                subtrain.Class
               </code>
              </div>
              <div class="line number9 index8 alt2">
               <code class="python plain">
                subtrain.drop([
               </code>
               <code class="python string">
                "Class"
               </code>
               <code class="python plain">
                ,
               </code>
               <code class="python string">
                "Id"
               </code>
               <code class="python plain">
                ], axis
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python value">
                1
               </code>
               <code class="python plain">
                , inplace
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python color1">
                True
               </code>
               <code class="python plain">
                )
               </code>
              </div>
              <div class="line number10 index9 alt1">
               <code class="python plain">
                subtrain
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python plain">
                subtrain.as_matrix()
               </code>
              </div>
              <div class="line number11 index10 alt2">
               <code class="python comments">
                # 将训练子集划分为训练集和测试集 其中测试集占40%
               </code>
              </div>
              <div class="line number12 index11 alt1">
               <code class="python plain">
                X_train, X_test, y_train, y_test
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python plain">
                cross_validation.train_test_split(subtrain,labels,test_size
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python value">
                0.4
               </code>
               <code class="python plain">
                )
               </code>
              </div>
              <div class="line number13 index12 alt2">
               <code class="python comments">
                # 构造随机森林 其中包含500棵决策树
               </code>
              </div>
              <div class="line number14 index13 alt1">
               <code class="python plain">
                srf
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python plain">
                RF(n_estimators
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python value">
                500
               </code>
               <code class="python plain">
                , n_jobs
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python keyword">
                -
               </code>
               <code class="python value">
                1
               </code>
               <code class="python plain">
                )
               </code>
              </div>
              <div class="line number15 index14 alt2">
               <code class="python plain">
                srf.fit(X_train,y_train)
               </code>
               <code class="python comments">
                # 训练
               </code>
              </div>
              <div class="line number16 index15 alt1">
               <code class="python functions">
                print
               </code>
               <code class="python plain">
                srf.score(X_test,y_test)
               </code>
               <code class="python comments">
                # 测试
               </code>
              </div>
             </div>
            </td>
           </tr>
          </tbody>
         </table>
        </div>
       </div>
       <h3>
        实验结果
       </h3>
       <p>
        这里只对预测的准确度做一个简单的评判。
       </p>
       <p>
        在只应用
        <code>
         .asm
        </code>
        文件图像特征(
        <code>
         firstrandomforest.py
        </code>
        )或者Opcode n-gram特征(
        <code>
         secondrandomforest.py
        </code>
        )的情况下，以及二者相结合的情况(
        <code>
         combine.py
        </code>
        )，准确率如下所示
       </p>
       <p>
        <img src="http://static.wooyun.org//drops/20150819/2015081908421713995.png"/>
       </p>
       <p>
        由于随机森林训练的过程中存在一定的随机性，因此每次结果不一定完全相同，但总的来说，二者结合的准确率通常要高出许多，基本可以达到98%以上的准确率，而且别忘了我们只用了不到
        <code>
         1/10
        </code>
        的数据
       </p>
       <h3>
        为什么是前800像素
       </h3>
       <p>
        观察.asm文件的格式，开头部分其实是IDA生成的一些信息，如下图所示
       </p>
       <p>
        <img src="http://static.wooyun.org//drops/20150819/2015081908421754743.png"/>
       </p>
       <p>
        可以目测这个长度已经超出了800个像素(800个字节)，实际上这800个像素和反汇编代码没有关系！完全就是IDA产生的一些信息，更进一步的说，实际上冠军队伍的方法压根与恶意代码图像没有关系，实际上是用到了IDA产生的信息。
       </p>
       <p>
        但是仔细观察这些IDA信息，貌似长的都差不多，也没有什么有价值的信息，为什么可以有效区分恶意软件类型呢？
       </p>
       <p>
        <strong>
         一个大胆的猜想
        </strong>
        是微软提前将这些恶意代码分好类，在调用IDA进行反汇编的时候是按照每个分类的顺序进行的，由于未知的原因可能导致了这些IDA信息在不同分类上有细微差别，恰好能作为一个非常有效的特征！
       </p>
       <h1>
        0x07 其他
       </h1>
       <hr/>
       <ul>
        <li>
         好的方法总是简单又好理解的。这次Kaggle比赛也是如此，冠军队伍的方法没有特别难理解的部分。但是请注意：面上的方法并不能体现背后难度和工作量，真正复杂和耗时的部分在于特征选择和交叉验证上。比如他们最终放弃GIST特征正是经过反复对比验证才做出的决定。
        </li>
        <li>
         这次的Kaggle比赛
         <strong>
          归根结底还是比赛
         </strong>
         ，最终目标是取得最好成绩，不代表这个方法在实际中一定好用。
        </li>
        <li>
         放弃GIST特征告诉我们一个宝贵的经验，并不是某个特征好就一定要用，还要考虑它和其他特征综合之后的效果。
        </li>
        <li>
         比赛的数据是去除了PE头的，而输入输出表对分析恶意代码是很有帮助的，假如微软提供的数据包含了PE头，将输入输出表作为特征，最终的结果应该还能进一步提升。
        </li>
        <li>
         这个方法的能够发现一些静态方法发现不了的变种，但对于未知的新品种依然无能为力(没有数据，机器学习巧妇难为无米之炊…)
        </li>
        <li>
         可以尝试将该方法应用到Android和IOS平台的恶意代码检测中。
        </li>
       </ul>
       <h1>
        0x08 资源和参考资料
       </h1>
       <hr/>
       <h3>
        比赛说明和原始数据
       </h3>
       <p>
        <a href="https://www.kaggle.com/c/malware-classification/">
         https://www.kaggle.com/c/malware-classification/
        </a>
       </p>
       <h3>
        冠军队伍相关资料
       </h3>
       <ul>
        <li>
         <a href="http://blog.kaggle.com/2015/05/26/microsoft-malware-winners-interview-1st-place-no-to-overfitting/">
          Kaggle采访
         </a>
        </li>
        <li>
         <a href="https://www.youtube.com/watch?v=VLQTRlLGz5Y">
          JiWei Liu的视频讲解
         </a>
        </li>
        <li>
         <a href="https://github.com/daxiongshu/kaggle_Microsoft_Malware">
          代码和PDF
         </a>
        </li>
       </ul>
       <h3>
        本文代码
       </h3>
       <p>
        <a href="https://github.com/bindog/ToyMalwareClassification">
         https://github.com/bindog/ToyMalwareClassification
        </a>
       </p>
       <h3>
        参考资料
       </h3>
       <p>
        <a href="https://vision.ece.ucsb.edu/sites/vision.ece.ucsb.edu/files/publications/nataraj_vizsec_2011_paper.pdf">
         Malware Images: Visualization and Automatic Classification
        </a>
       </p>
       <p>
        <a href="http://www.security-informatics.com/content/pdf/2190-8532-1-1.pdf">
         Detecting unknown malicious code by applying classification techniques on OpCode patterns
        </a>
        (墙裂推荐)
       </p>
       <p>
        <a href="http://blog.csdn.net/yujin753/article/details/20397805">
         如何使用GIST+LIBLINEAR分类器提取CIFAR-10 dataset数据集中图像特征，并用测试数据进行实验
        </a>
       </p>
       <p>
        <a href="http://www.cnblogs.com/justany/archive/2012/12/06/2804211.html">
         GIST特征描述符使用
        </a>
       </p>
       <p>
        <a href="http://www.zilhua.com/629.html">
         随机森林算法
        </a>
       </p>
       <p>
        <a href="https://www.youtube.com/watch?v=loNcrMjYh64">
         How Random Forest algorithm works
        </a>
       </p>
       <p>
        <a href="http://sarvamblog.blogspot.jp/2014/08/supervised-classification-with-k-fold.html">
         Supervised Classification with k-fold Cross Validation on a Multi Family Malware Dataset
        </a>
       </p>
       <p>
        我的博客 &lt;http://bindog.github.io/blog/ &gt; 我的邮箱 bindog 艾特 奥特路克 .com 欢迎大家与我交流~
       </p>
      </div>
      <div>
       <strong>
        注：转载文章均来自于公开网络，仅供学习使用，不会用于任何商业用途，如果侵犯到原作者的权益，请您与我们联系删除或者授权事宜，联系邮箱：contact@dataunion.org。转载数盟网站文章请注明原文章作者，否则产生的任何版权纠纷与数盟无关。
       </strong>
      </div>
      <!--content_text-->
      <div class="fenxian">
       <!-- JiaThis Button BEGIN -->
       <div class="jiathis_style_32x32">
        <p class="jiathis_button_weixin">
        </p>
        <p class="jiathis_button_tsina">
        </p>
        <p class="jiathis_button_qzone">
        </p>
        <p class="jiathis_button_cqq">
        </p>
        <p class="jiathis_button_tumblr">
        </p>
        <a class="jiathis jiathis_txt jtico jtico_jiathis" href="http://www.jiathis.com/share" target="_blank">
        </a>
        <p class="jiathis_counter_style">
        </p>
       </div>
       <!-- JiaThis Button END -->
      </div>
     </article>
     <!--content-->
     <!--相关文章-->
     <div class="xianguan">
      <div class="xianguantitle">
       相关文章！
      </div>
      <ul class="pic">
       <li>
        <a href="http://dataunion.org/20824.html">
         <img src="http://dataunion.org/wp-content/uploads/2015/09/t018630756a7e263b33-300x165.jpg"/>
        </a>
        <a class="link" href="http://dataunion.org/20824.html" rel="bookmark" title="如何判断一笔交易是否属于欺诈？你只是需要一点数据挖掘">
         如何判断一笔交易是否属于欺诈？你只是需要一点数据挖掘
        </a>
       </li>
       <li>
        <a href="http://dataunion.org/20820.html">
         <img src="http://dataunion.org/wp-content/uploads/2015/09/1-300x200.jpg"/>
        </a>
        <a class="link" href="http://dataunion.org/20820.html" rel="bookmark" title="人们对Python在企业级开发中的10大误解">
         人们对Python在企业级开发中的10大误解
        </a>
       </li>
       <li>
        <a href="http://dataunion.org/20811.html">
         <img src="http://dataunion.org/wp-content/uploads/2015/09/t0133fcacae8523307b_副本-300x200.jpg"/>
        </a>
        <a class="link" href="http://dataunion.org/20811.html" rel="bookmark" title="大神亲传：26条深度学习的金科玉律！">
         大神亲传：26条深度学习的金科玉律！
        </a>
       </li>
       <li>
        <a href="http://dataunion.org/20808.html">
         <img src="http://dataunion.org/wp-content/uploads/2015/09/640.webp-11-300x137.jpg"/>
        </a>
        <a class="link" href="http://dataunion.org/20808.html" rel="bookmark" title="我们是如何在一张地图上表现86万个数据的">
         我们是如何在一张地图上表现86万个数据的
        </a>
       </li>
      </ul>
     </div>
     <!--相关文章-->
     <div class="comment" id="comments">
      <!-- You can start editing here. -->
      <!-- If comments are open, but there are no comments. -->
      <div class="title">
       期待你一针见血的评论，Come on！
      </div>
      <div id="respond">
       <p>
        不用想啦，马上
        <a href="http://dataunion.org/wp-login.php?redirect_to=http%3A%2F%2Fdataunion.org%2F20505.html">
         "登录"
        </a>
        发表自已的想法.
       </p>
      </div>
     </div>
     <!-- .nav-single -->
    </div>
    <!--Container End-->
    <aside id="sitebar">
     <div class="sitebar_list2">
      <div class="wptag">
       <span class="tagtitle">
        热门标签+
       </span>
       <div class="tagg">
        <ul class="menu" id="menu-%e5%8f%8b%e6%83%85%e9%93%be%e6%8e%a5">
         <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-1605" id="menu-item-1605">
          <a href="http://taidizh.com/">
           泰迪智慧
          </a>
         </li>
         <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-20884" id="menu-item-20884">
          <a href="http://www.transwarp.cn/">
           星环科技
          </a>
         </li>
         <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-3538" id="menu-item-3538">
          <a href="http://datall.org/">
           珈和遥感
          </a>
         </li>
         <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-20888" id="menu-item-20888">
          <a href="http://www.chinahadoop.cn/">
           小象学院
          </a>
         </li>
        </ul>
       </div>
      </div>
     </div>
     <div class="sitebar_list">
      <div class="textwidget">
       <div align="center">
        <a href="http://study.163.com/course/courseMain.htm?courseId=991022" target="_blank">
         <img src="http://dataunion.org/wp-content/uploads/2016/03/dv.jpg"/>
        </a>
       </div>
      </div>
     </div>
     <div class="sitebar_list">
      <h4 class="sitebar_title">
       文章分类
      </h4>
      <div class="tagcloud">
       <a class="tag-link-44" href="http://dataunion.org/category/industry/demo" style="font-size: 10.204724409449pt;" title="4个话题">
        Demo展示
       </a>
       <a class="tag-link-31" href="http://dataunion.org/category/experts" style="font-size: 15.826771653543pt;" title="52个话题">
        专家团队
       </a>
       <a class="tag-link-870" href="http://dataunion.org/category/tech/ai" style="font-size: 19.795275590551pt;" title="273个话题">
        人工智能
       </a>
       <a class="tag-link-488" href="http://dataunion.org/category/%e5%8a%a0%e5%85%a5%e6%95%b0%e7%9b%9f" style="font-size: 8pt;" title="1个话题">
        加入数盟
       </a>
       <a class="tag-link-869" href="http://dataunion.org/category/tech/viz" style="font-size: 17.204724409449pt;" title="93个话题">
        可视化
       </a>
       <a class="tag-link-30" href="http://dataunion.org/category/partners" style="font-size: 10.645669291339pt;" title="5个话题">
        合作伙伴
       </a>
       <a class="tag-link-889" href="http://dataunion.org/category/parterc" style="font-size: 11.582677165354pt;" title="8个话题">
        合作会议
       </a>
       <a class="tag-link-104" href="http://dataunion.org/category/books" style="font-size: 12.96062992126pt;" title="15个话题">
        图书
       </a>
       <a class="tag-link-220" href="http://dataunion.org/category/tech/base" style="font-size: 19.850393700787pt;" title="281个话题">
        基础架构
       </a>
       <a class="tag-link-219" href="http://dataunion.org/category/tech/analysis" style="font-size: 19.409448818898pt;" title="232个话题">
        数据分析
       </a>
       <a class="tag-link-887" href="http://dataunion.org/category/tech/dm" style="font-size: 13.291338582677pt;" title="17个话题">
        数据挖掘
       </a>
       <a class="tag-link-34" href="http://dataunion.org/category/tech" style="font-size: 20.732283464567pt;" title="404个话题">
        文章
       </a>
       <a class="tag-link-1" href="http://dataunion.org/category/uncategorized" style="font-size: 22pt;" title="693个话题">
        未分类
       </a>
       <a class="tag-link-4" href="http://dataunion.org/category/events" style="font-size: 14.503937007874pt;" title="29个话题">
        活动
       </a>
       <a class="tag-link-890" href="http://dataunion.org/category/tech/%e6%b7%b1%e5%ba%a6%e5%ad%a6%e4%b9%a0" style="font-size: 10.204724409449pt;" title="4个话题">
        深度学习
       </a>
       <a class="tag-link-221" href="http://dataunion.org/category/tech/devl" style="font-size: 18.968503937008pt;" title="193个话题">
        编程语言
       </a>
       <a class="tag-link-888" href="http://dataunion.org/category/career" style="font-size: 15.661417322835pt;" title="48个话题">
        职业规划
       </a>
       <a class="tag-link-5" href="http://dataunion.org/category/jobs" style="font-size: 14.11811023622pt;" title="25个话题">
        职位
       </a>
       <a class="tag-link-871" href="http://dataunion.org/category/industry" style="font-size: 15.716535433071pt;" title="49个话题">
        行业
       </a>
       <a class="tag-link-613" href="http://dataunion.org/category/industry/case" style="font-size: 16.984251968504pt;" title="84个话题">
        行业应用
       </a>
       <a class="tag-link-885" href="http://dataunion.org/category/industry/news" style="font-size: 17.425196850394pt;" title="102个话题">
        行业资讯
       </a>
       <a class="tag-link-10" href="http://dataunion.org/category/training" style="font-size: 14.228346456693pt;" title="26个话题">
        课程
       </a>
       <a class="tag-link-16" href="http://dataunion.org/category/sources" style="font-size: 15.661417322835pt;" title="48个话题">
        资源
       </a>
      </div>
     </div>
     <div class="sitebar_list">
      <h4 class="sitebar_title">
       功能
      </h4>
      <ul>
       <li>
        <a href="http://dataunion.org/wp-login.php?action=register">
         注册
        </a>
       </li>
       <li>
        <a href="http://dataunion.org/wp-login.php">
         登录
        </a>
       </li>
       <li>
        <a href="http://dataunion.org/feed">
         文章
         <abbr title="Really Simple Syndication">
          RSS
         </abbr>
        </a>
       </li>
       <li>
        <a href="http://dataunion.org/comments/feed">
         评论
         <abbr title="Really Simple Syndication">
          RSS
         </abbr>
        </a>
       </li>
       <li>
        <a href="https://cn.wordpress.org/" title="基于WordPress，一个优美、先进的个人信息发布平台。">
         WordPress.org
        </a>
       </li>
      </ul>
     </div>
    </aside>
    <div class="clear">
    </div>
   </div>
   <!--main-->
   ﻿
   <footer id="dibu">
    <div class="about">
     <div class="right">
      <ul class="menu" id="menu-%e5%ba%95%e9%83%a8%e8%8f%9c%e5%8d%95">
       <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-18024" id="menu-item-18024">
        <a href="http://dataunion.org/category/partners">
         合作伙伴
        </a>
       </li>
       <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-20881" id="menu-item-20881">
        <a href="http://dataunion.org/contribute">
         文章投稿
        </a>
       </li>
       <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20872" id="menu-item-20872">
        <a href="http://dataunion.org/category/%e5%8a%a0%e5%85%a5%e6%95%b0%e7%9b%9f">
         加入数盟
        </a>
       </li>
       <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-22441" id="menu-item-22441">
        <a href="http://dataunion.org/f-links">
         友情链接
        </a>
       </li>
       <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-20874" id="menu-item-20874">
        <a href="http://dataunion.org/aboutus">
         关于数盟
        </a>
       </li>
      </ul>
      <p class="banquan">
       数盟社区        ，
        做最棒的数据科学社区
      </p>
     </div>
     <div class="left">
      <ul class="bottomlist">
       <li>
        <a href="http://weibo.com/DataScientistUnion  " target="_blank" 　title="">
         <img src="http://dataunion.org/wp-content/themes/yzipi/images/weibo.png"/>
        </a>
       </li>
       <li>
        <a class="cd-popup-trigger" href="http://dataunion.org/20505.html#0">
         <img src="http://dataunion.org/wp-content/themes/yzipi/images/weixin.png"/>
        </a>
       </li>
      </ul>
      <div class="cd-popup">
       <div class="cd-popup-container">
        <h1>
         扫描二维码,加微信公众号
        </h1>
        <img src="http://dataunion.org/wp-content/themes/yzipi/images/2014-12-06-1515289049.png"/>
        <a class="cd-popup-close" href="http://dataunion.org/20505.html">
        </a>
       </div>
       <!-- cd-popup-container -->
      </div>
      <!-- cd-popup -->
     </div>
    </div>
    <!--about-->
    <div class="bottom">
     <a href="http://dataunion.org/">
      数盟社区
     </a>
     <a href="http://www.miitbeian.gov.cn/" rel="external nofollow" target="_blank">
      京ICP备14026740号
     </a>
     联系我们：
     <a href="mailto:contact@dataunion.org" target="_blank">
      contact@dataunion.org
     </a>
     <div class="tongji">
     </div>
     <!--bottom-->
     <div class="scroll" id="scroll" style="display:none;">
      ︿
     </div>
    </div>
   </footer>
   <!--dibu-->
  </div>
 </body>
</html>